#ifndef NET_SOCK_H
#define NET_SOCK_H

#include "wrap/inet.h"

namespace Sock {

struct sockaddr *sockaddr_cast(struct sockaddr_in *addr);
const struct sockaddr *sockaddr_cast(const struct sockaddr_in *addr);
const struct sockaddr_in *sockaddr_in_cast(const struct sockaddr *addr);

int accept(struct sockaddr_in &addr, int fd);
void bind(int fd, const struct sockaddr *addr);
int connect(int fd, const struct sockaddr *addr);
int create_nonblock_socket(sa_family_t family);
int socket_error(int fd);
void IP_port_to_network(struct sockaddr_in &addr, const char *ip, uint16_t port);
bool is_connect_to_self(int fd);
struct sockaddr_in local_addr(int fd);
void network_to_IP(char *buffer, size_t size, const struct sockaddr *addr);
void network_to_IP_port(char *buffer, size_t size, const struct sockaddr *addr);
struct sockaddr_in peer_addr(int fd);
int set_socket_option(int fd, int name, int opt);

}


#endif